const mqtt = require('mqtt');

// 设备配置，需根据实际设备号修改
const hwid = '123456'; // 此处填写12dsj.com中免费申请的设备id
const password = '654321'; // 可在“设置”页中找到免费id和密码

// mq连接配置
const mqSrvCfg = {
  host: 'srv.12dsj.com', // 服务器地址
  port: 8883,
  protocol: 'mqtt',
  clean: false,
  username: 'dtu', // mqtt用户名，必须为dtu，否则连不上
  clientId: 'dtu.'+hwid, // mqtt用户id，必须为dtu.*** (其中***为设备id)
  password: password // mqtt密码，可在网站中查看
};

// 打印启动信息
console.log('start work for dtu', hwid);

// 连接mqtt服务器
const Client = mqtt.connect(mqSrvCfg);

// mqtt连接成功 回调
Client.on('connect', (Pkt)=>{
  console.log('mq conn ok');

  const Topics = [`dtu/cmd/${hwid}`]; // 订阅cmd主题，平台的命令由此进
  console.log('sub', Topics);
  Client.subscribe(Topics, (err)=>{if(err) console.log('top err:',err)});
}) // end client on

// mqtt客户端收到消息 回调
Client.on('message', (Topic,Payload,Pkt)=>{
  console.log(Topic, Payload); // 打印收到的报文

  let exec = require('child_process').exec; // 将收到的报文传递到shell执行
  exec(Payload.toString(), (err,stdout,stderr)=>{
    if (err) {
      console.log('cmd err:'+stderr);
    } else {
      console.log('cmd ret:\n'+stdout);
      Client.publish(`dtu/cmdres/${hwid}`, stdout); // shell返回的结果，发送到cmdres主题上
    }
  })
}) // end client on

// mqtt客户端断开连接 回调
Client.on('disconnect', (packet)=>{
  console.log('mqClient disconnect', packet);
  process.exit(0); // 主动退出，由外部自动重启
}) // end client on

// mqtt客户端关闭 回调
Client.on('close', ()=>{
  console.log('mqClient close');
  process.exit(0); // 主动退出，由外部自动重启
}) // end client on

// mqtt连接结束 回调
Client.on('end', ()=>{
  console.log('mqClient end');
  process.exit(0); // 主动退出，由外部自动重启
}) // end client on

// mqtt客户端出错 回调
Client.on('error', (err,granted)=>{
  console.log('mqClient error', err, granted);
  process.exit(0); // 主动退出，由外部自动重启
}) // end client on